package com.bocai.mybase.net;



import com.bocai.mybase.base.BaseResponse;
import com.bocai.mybase.bean.AddressPortBean;
import com.bocai.mybase.bean.ChangePhoneBean;
import com.bocai.mybase.bean.OptionalSeatsBean;

import java.util.List;
import java.util.Map;

import okhttp3.MultipartBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;


/**
 * 作者 yuanfei on 2017/2/17.
 * 邮箱 yuanfei221@126.com
 */

public interface Api {

    @FormUrlEncoded
    @POST(Url.SENDCODE)
    Observable<BaseResponse> sendCode(@Field("PhoneNumber") String PhoneNumber, @Field("RequestType") String RequestType);

    /**
     * 获取手机号状态
     * @param phoneNumber
     * @return
     */
    @GET(Url.PHONETYPE)
    Observable<BaseResponse> phoneType(@Path("phoneNumber") String phoneNumber,@Query("mtype") String mtype);


    /**
     * 会员注册
     * @param PhoneNumber 手机号
     * @param Password  密码
     * @param SmsVerifyCode 短信验证码
     * @param MemberType  会员类型 【1-旅行社】【2-车队】【3-司机】
     * @return
     */
    @FormUrlEncoded
    @POST(Url.REGISTER)
    Observable<BaseResponse> register(@Field("PhoneNumber") String PhoneNumber, @Field("Password") String Password,
                                      @Field("SmsVerifyCode") String SmsVerifyCode, @Field("MemberType") int MemberType,@Field("MobileDevice") String MobileDevice);

    /**
     * 会员登陆
     * @param PhoneNumber
     * @param Password
     * @param MobileDevice 设备编号，使用极光推送的话，使用极光推送的RegistrationId
     * @return
     */
    @FormUrlEncoded
    @POST(Url.LOGIN)
    Observable<BaseResponse> login(@Field("PhoneNumber") String PhoneNumber, @Field("Password") String Password,
                                      @Field("MobileDevice") String MobileDevice,@Field("MemberType") String MemberType);

    /**
     * 找回/重置/设置密码
     * @param PhoneNumber
     * @param Password
     * @param SmsVerifyCode
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.RESETPW)
    Observable<BaseResponse> resetPw( @Field("PhoneNumber") String PhoneNumber, @Field("Password") String Password, @Field("SmsVerifyCode") String SmsVerifyCode,@Field("MemberType") String MemberType);

    /**
     * 修改手机号
     * @param ID 会员ID
     * @return
     */
    @Headers({"Content-Type: application/json;charset=UTF-8"})
    @PATCH(Url.CHANGEPHONE)
    Observable<BaseResponse> changePhone(@Path("ID") String ID, @Body ChangePhoneBean bean);

    /**
     * 图片上传
     * @param parts
     * @return
     */
    @Multipart
    @POST(Url.UPLOADIMG)
    Observable<BaseResponse> uploadImage( @Part List<MultipartBody.Part> parts);


    /**
     * 更新会员头像
     * @param memberId
     * @param AvatarId
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.AVATARUPLOADIMG)
    Observable<BaseResponse> avatarImg( @Path("memberId") String memberId, @Field("AvatarId") String AvatarId);

    /**
     * 新增收货地址
     * @param Address 详细地址
     * @param Contacts 收货联系人
     * @param Phone 联系电话
     * @param Province 省级Id
     * @param City 市级Id
     * @param District 区县级Id
     * @param Street 街道/乡镇Id
     * @param RegionName 地区名字，每个级别之间用逗号隔开
     * @param Postcode 邮政编码
     * @return
     */
//    @FormUrlEncoded
//    @POST(Url.ADDADDRESS)
//    Observable<BaseResponse> addAddress(@Field("Address") String Address, @Field("Contacts") String Contacts,
//                                        @Field("Phone") String Phone,@Field("Province") String Province,
//                                        @Field("City") String City,@Field("District") String District,
//                                        @Field("Street") String Street,@Field("RegionName") String RegionName,
//                                        @Field("Postcode") String Postcode);
    @Headers({"Content-Type: application/json;charset=UTF-8"})
    @POST(Url.ADDADDRESS)
    Observable<BaseResponse> addAddress(@Body AddressPortBean bean);

    /**
     * 地址列表
     * @return
     */
    @GET(Url.ADDRESSLIST)
    Observable<BaseResponse> addressList();

    /**
     * 删除收货地址
     * @return
     */
    @DELETE(Url.DELETEADDRESS)
    Observable<BaseResponse> deleteAddress(@Path("addressId") String addressId);

    /**
     * 修改收货地址
     * @return
     */
    @PUT(Url.MODIFYADDRESS)
    Observable<BaseResponse> modifyAddress(@Path("addressId") String addressId,@Body AddressPortBean bean);


    /**
     * 旅行社提交认证信息
     * @param CompanyName 公司名称
     * @param ContactName 联系人
     * @param IdNumber 身份证
     * @param LicenseId 营业执照图片Id
     * @return
     */
    @FormUrlEncoded
    @POST(Url.PUTTRAVELINFOR)
    Observable<BaseResponse> travelInfor(@Path("memberId") String memberId,@Field("CompanyName") String CompanyName, @Field("ContactName") String ContactName,
                                         @Field("IdNumber") String IdNumber, @Field("LicenseId") String LicenseId);

    /**
     * 获取会员认证信息
     * @param memberId
     * @return
     */
    @GET(Url.GETTRAVELINFOR)
    Observable<BaseResponse> getTravelInfor(@Path("memberId") String memberId);

    /**
     * 退出登录
     * @return
     */
    @POST(Url.LOGOUT)
    Observable<BaseResponse> logOut();

    /**
     * 查询路线是否在运营范围
     * @param originCity 始发城市Id
     * @param arrivalCity 目的城市Id
     * @return
     */
    @GET(Url.PRICELIST)
    Observable<BaseResponse> checkLine(@Query("addressId") String addressId);

    /**
     * 旅行社发布行程
     * @param PriceId 路线价格Id
     * @param Address 详细地址
     * @param DepartureTime 用车时间
     * @return
     */
    @FormUrlEncoded
    @POST(Url.PUBLISHSTROKE)
    Observable<BaseResponse> publishStroke(@Field("PriceId") String PriceId,
                                         @Field("DepartureTime") String DepartureTime);

    /**
     * 可选择车辆座位数
     * @return
     */
    @GET(Url.OPTIONALSEATS)
    Observable<OptionalSeatsBean> optionalSeats();

    /**
     *首页行程列表
     * @param pageIndex 页码【默认1】
     * @param pageSize 页大小【默认10】
     * @param time 用车时间
     * @param seats 座位数
     * @param originCity 始发城市名称
     * @param arriveCity 目的城市名称
     * @return
     */
    @GET(Url.HOMELIST)
    Observable<BaseResponse> homeList(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize,
                                           @Query("time") String time,@Query("seats") String seats,
                                           @Query("originCity") String originCity,@Query("arriveCity") String arriveCity);

    /**
     * 我发布的行程
     * @param pageIndex 页码【默认1】
     * @param pageSize 页大小【默认10】
     * @return
     */
    @GET(Url.MYPUBLISHSTROKE)
    Observable<BaseResponse> myStrokePublish(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     *
     * @param orderId
     * @param DepartureTime 用车时间【旅行社抢单必填】
     * @return
     */
    @FormUrlEncoded
    @POST(Url.GRADORDER)
    Observable<BaseResponse> grabOrder(@Path("orderId") String orderId, @Field("DepartureTime") String DepartureTime);

    /**
     * 车辆详情
     * @param orderId
     * @return
     */
    @GET(Url.GETCARINFO)
    Observable<BaseResponse> getCarInfo(@Path("orderId") String orderId);

    /**
     * 我的抢单
     * @param pageIndex
     * @param pageSize
     * @return
     */
    @GET(Url.MYGRADORDER)
    Observable<BaseResponse> myGrabOrder(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     * 我的钱包
     * @param Available 钱包金额
     * @param Withdrawals 提现冻结金额
     * @param Bail 保证金
     * @return
     */
    @GET(Url.MYWALLET)
    Observable<BaseResponse> myWallet(@Query("Available") String Available,@Query("Withdrawals") String Withdrawals,@Query("Bail") String Bail);

    /**
     * 订单支付【测试用】
     * @param orderId
     * @return
     */
    @PATCH(Url.ORDERPAY)
    Observable<BaseResponse> orderPay( @Path("orderId") String orderId);

    /**
     * 订单详情
     * @param orderId
     * @return
     */
    @GET(Url.ORDERDETAIL)
    Observable<BaseResponse> orderDetail(@Path("orderId") String orderId);

    /**
     * 我的发票
     * @param pageIndex
     * @param pageSize
     * @return
     */
    @GET(Url.MYINVOICE)
    Observable<BaseResponse> myInvoice(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     * 开票
     * @param orderId
     * @param InvoiceNumber 税号
     * @param Memo 发票抬头
     * @param AddressId 收货地址Id
     * @return
     */
    @FormUrlEncoded
    @POST(Url.OPENINVOICE)
    Observable<BaseResponse> openInvoice(@Path("orderId") String orderId, @Field("InvoiceNumber") String InvoiceNumber,@Field("Memo") String Memo,@Field("AddressId") String AddressId);

    /**
     * 取消行程
     * @param orderId
     * @return
     */
    @PATCH(Url.CANCLEORDER)
    Observable<BaseResponse> cancleOrder( @Path("orderId") String orderId);

    /**
     * 发票详情
     * @param orderId
     * @return
     */
    @GET(Url.INVOICEDETAIL)
    Observable<BaseResponse> invoiceDetail(@Path("orderId") String orderId);

    /**
     * 消息列表【分页】
     * @param pageIndex 页码【默认1】
     * @param pageSize 页大小【默认10】
     * @return
     */
    @GET(Url.MESSAGELIST)
    Observable<BaseResponse> messageList(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     * 消息设为已读
     * @param messageId
     * @return
     */
    @PATCH(Url.READMESSAGE)
    Observable<BaseResponse> readMessage( @Path("messageId") String messageId);

    /**
     * 删除消息
     * @param messageId
     * @return
     */
    @DELETE(Url.DELETEMESSAGE)
    Observable<BaseResponse> deleteMessage(@Path("messageId") String messageId);

    /**
     * 获取会员信息
     * @return
     */
    @GET(Url.GETUSER)
    Observable<BaseResponse> getUser();

    /**
     * 单页内容
     * @param key  01 【客拉拉用车服务协议】 02【关于客拉拉】
     * @return
     */
    @GET(Url.WEBVIEWPAGE)
    Observable<BaseResponse> webViewPage(@Path("key") String key);

    /**
     *
     * @param paymentCode
     * @param orderId
     * @return
     */
    @POST(Url.PAYTYPE)
    Observable<BaseResponse> payType(@Path("paymentCode") String paymentCode, @Path("orderId") String orderId);

    /**
     * 出发地列表
     * @return
     */
    @GET(Url.ORIGINAREAS)
    Observable<BaseResponse> originAreas();

    /**
     * 目的地列表
     * @param originCityId 出发地市Id
     * @param originAddress 出发地详细地址
     * @return
     */
    @GET(Url.ARRIVEAREAS)
    Observable<BaseResponse> arriveAreas(@Query("originCityId") String originCityId,@Query("originAddress") String originAddress);

    /**
     * 客服电话和保证金
     * @return
     */
    @GET(Url.CONFIG)
    Observable<BaseResponse> config();

    /**
     * 获取可修改地址列表
     * @param orderId
     * @return
     */

    @GET(Url.ORDERADDRESSLIST)
    Observable<BaseResponse> getAddressList(@Path("orderId") String orderId);

    /**
     * 修改行程地址
     * @param orderId
     * @param PriceId
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.MODIFYORDERADDRESS)
    Observable<BaseResponse> modifyOrderAddress(@Path("orderId") String orderId,@Field("PriceId") String PriceId);

    /**
     * 设置修改地址新增时间
     * @param orderId
     * @param DepartureTime
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.ADDDEPARTTIME)
    Observable<BaseResponse> addDepartTime(@Path("orderId") String orderId,@Field("DepartureTime") String DepartureTime);







}
